# -*- coding: utf-8 -*-
"""
AutoGPT 多智能体复杂 Demo（本地 Qwen3:8b）
- 多轮循环，自动终止
- 多智能体协作（Planner、Critic、Actor、Observer）
"""
from langchain_ollama import OllamaLLM

llm = OllamaLLM(model="qwen3:8b", temperature=0.3)


def planner(goal, history):
    prompt = f"""你是 Planner 智能体。目标：{goal}
历史：{history}
请将目标分解为详细计划，列出每一步。"""
    return llm.invoke(prompt).strip()


def critic(plan, history):
    prompt = f"""你是 Critic 智能体。请评估以下计划的可行性和效率，指出潜在问题和改进建议：
计划：{plan}
历史：{history}"""
    return llm.invoke(prompt).strip()


def actor(plan, history):
    prompt = f"""你是 Actor 智能体。请根据以下计划的第一步，模拟执行操作，并输出执行结果。
计划：{plan}
历史：{history}"""
    return llm.invoke(prompt).strip()


def observer(act_result, history):
    prompt = f"""你是 Observer 智能体。你刚刚观察到如下操作结果：{act_result}
历史：{history}
请分析该结果，给出反馈，指出是否达成预期，有哪些可以改进的地方。"""
    return llm.invoke(prompt).strip()


def auto_gpt_multiagent(goal, max_rounds=5):
    history = ""
    plan = planner(goal, history)
    for round in range(1, max_rounds + 1):
        print(f"\n=== 第{round}轮 ===")
        print(f"[Planner] 计划:\n{plan}\n")
        criticism = critic(plan, history)
        print(f"[Critic] 批判:\n{criticism}\n")
        act_result = actor(plan, history)
        print(f"[Actor] 执行结果:\n{act_result}\n")
        observation = observer(act_result, history)
        print(f"[Observer] 观察反馈:\n{observation}\n")
        # 终止条件：执行结果或反馈中包含"已完成"或"目标达成"
        if any(x in act_result + observation for x in ["已完成", "目标达成", "任务完成"]):
            print("\n[系统] 检测到任务已完成，自动终止。\n")
            break
        # 更新历史，便于多智能体协作记忆
        history += f"\nRound {round}:\nPlan: {plan}\nCritic: {criticism}\nAct: {act_result}\nObserve: {observation}\n"
        # Planner 根据反馈修订计划
        plan = planner(goal, history)


if __name__ == "__main__":
    goal = "写一篇关于人工智能对未来社会影响的短文"
    auto_gpt_multiagent(goal, max_rounds=5)
